草庐IT

C++ STL : Passing an empty container to lower_bound

全部标签

c++ - STL函数来测试一个值是否在某个范围内?

我有一个函数:boolinBounds(intvalue,intlow,inthigh)。是否有一个STL等价物可以做有用的事情(特别是采用不同类型的变量)?我找不到使用谷歌的,我宁愿重新使用而不是重写。 最佳答案 在C++17中,没有像这样的函数的直接等价物,但对于具有快速相等比较的较小类型,您可以使用std::clamp:if(val==std::clamp(val,low,high)){...}或者,您可以编写自己的函数来对此进行测试:templateboolIsInBounds(constT&value,constT&low

c++ - 在闭源库中使用 STL

在库中使用一种符合标准的STL,而在使用该库的项目中使用另一种是否安全?例如://library.h#include//let'ssayhereitusesminGWSTLvoidFoo(std::string&str_mingw);//library.cppvoidFoo(std::string&str_mingw){/*dosomething*/}//application.cpp#include"library.h"#include//let'ssayhereitusesVStudioSTLvoidBar(){std::stringstr_vstudio;Foo(str_vstu

c++ - STL 容器是否使用隐式共享?

众所周知,Qt小部件使用implicitsharing.所以我对STL容器std::vector、std::string是否也使用隐式共享感兴趣。如果不是,为什么?因为它非常有用。如果答案是肯定的,我们如何确定呢?我需要简单的C++STL程序,它表明STL容器使用隐式共享。复制时它不进行深度复制。 最佳答案 没有。他们不能。当您尝试修改容器的内容,或者甚至在其上调用可变begin()时,这将意味着潜在的写时复制,从而使对容器的所有引用和迭代器无效。这将是一种难以调试的情况,因此是被禁止的。尽管std::string在技术上不是容器,

c++ - 在 push_back pop_front 场景中是否需要使用互斥锁锁定 STL 列表?

我有一个线程后推到STL列表,另一个线程从列表中弹出。在这种情况下我需要用互斥量锁定列表吗? 最佳答案 来自SGI'sSTLonThreadSafety:Ifmultiplethreadsaccessasinglecontainer,andatleastonethreadmaypotentiallywrite,thentheuserisresponsibleforensuringmutualexclusionbetweenthethreadsduringthecontaineraccesses.由于您的两个线程都修改了列表,我想您必

c++ - 如何在 DLL 边界上公开 STL 列表?

我有一个DLL,它需要访问存储在主机应用程序的STL容器中的数据。因为C++没有标准的ABI,而且我想支持不同的编译器,所以应用程序和DLL之间的接口(interface)基本上必须保持纯旧数据。对于vector,这是相对简单的。您可以简单地返回vector的内存块,因为它保证是连续的://ToreturnvectordatavirtualvoidGetVectorData(constint*&ptr,size_t&count)const{if(!vec.empty())ptr=&(vec.front());count=vec.size();}现在DLL可以通过该接口(interfac

c++ - STL(标准模板库)中使用的设计模式

我正在学习STL和设计模式。我想知道是否有任何文档或链接解释了如何在STL中实现设计模式我做了谷歌,但无法获得太多数据 最佳答案 我希望你的意思是,“哪些设计模式可以在STL中识别”。STL栈是一个容器适配器。适配器是一种设计模式。迭代器也是一种设计模式。STL函数对象与命令模式相关。模式:适配器(容器适配器)堆栈队列优先队列迭代器Command+Adapter(函数适配器)Iterator+Adapter(迭代器适配器)反向迭代器插入迭代器流迭代器模板方法(使用用户指定函数的STL算法)哪种创作模式?(分配器)这些模式的实现方式与

c++ - 带空字符的 STL basic_string 长度

为什么您可以在std::basic_string中插入一个'\0'字符并且.length()方法不受影响,但是如果您调用char_traits::length(str.c_str())你得到字符串的长度直到第一个'\0'字符?例如stringstr("abcdefgh");cout::length(str.c_str());//4 最佳答案 好问题!原因是C风格的字符串被定义为以空字节结尾的字节序列。当您使用.c_str()从C++中获取C风格的字符串std::string,然后您将返回C++字符串存储的序列,其后有一个空字节。当您

c++ - 在没有原始循环的情况下将数据添加到 STL 容器

我经常看到您可以用STL算法替换所有手写/原始循环。只是为了提高我的C++知识,我一直在尝试这样做。为了用数据填充std::vector,我使用了for循环和循环索引。unsignedintbuffer_size=(format.getBytesPerSecond()*playlen)/1000;//pcmdatastoredina'shorttype'vectorvectorpcm_data;for(unsignedinti=0;i(amplitude*sin((2*M_PI*i*frequency)/format.SampleRate)));}上面的代码工作正常,正如你所看到的,我

c++ - 包含引用的 STL 映射无法编译

以下内容:std::maptest;给出:errorC2101:'&'onconstant虽然下面std::maptest;给予errorC2528:'_First':pointertoreferenceisillegal后者似乎map不能包含键值的引用,因为它有时需要实例化类,而没有对象就无法实例化引用。但为什么第一种情况不起作用? 最佳答案 在STL容器中存储引用是非法的,因为类型必须是可复制构造和可赋值的。无法分配引用。究竟是什么操作导致第一个错误取决于实现,但我认为它与创建引用而不是立即分配它有关。第二条错误消息看起来实际上

c++ - STL 前后递增运算符的概念区别

据说:for(vector::iteratoriter=ivec.begin();iter!=ivec.end();++iter){}我确实理解像int等内置类型的前/后增量的区别,但就迭代器而言,++iter和iter++?(请记住,我确实知道两者在这里会产生相同的结果)。 最佳答案 ++iter最有可能比iter++更快但绝不会慢。实现后自增运算符iter++需要生成一个额外的临时对象(这个临时对象在原iter自增时返回++)超过实现后增量运算符++iter,因此除非编译器可以优化(是的,它可以)后增量,否则++iter很可能比